import {crmUrl} from '@/utils/api';  
import axios from 'axios'
import { ElMessage } from 'element-plus';
import html2canvas from 'html2canvas'
import jspdf from 'jspdf'
//时间日期转换成string
function dateToString2(time){ //苹果时间格式：'年/月/日 时:分:秒'，如果没有时分秒，必须00:00:00
    if(time==""||time==null){
        return '';
    }
    var date = new Date(time);
    var year = date.getFullYear(); 
    var month =(date.getMonth() + 1).toString(); 
    var day = (date.getDate()).toString();  
    if (month.length == 1) { 
        month = "0" + month; 
    } 
    if (day.length == 1) { 
        day = "0" + day; 
    }
    var dateTime = year + "-" + month + "-" + day;
    return dateTime; 
  }
//时间日期转换成string
function dateToString(time){ 
    if(time==""||time==null){
        return '';
    }
    var date = new Date(time);
    var year = date.getFullYear(); 
    var month =(date.getMonth() + 1).toString(); 
    var day = (date.getDate()).toString();  
    //时
    var hh=date.getHours().toString();
    //分
    var mm=date.getMinutes().toString();
    //秒
    var ss=date.getSeconds().toString();
    if (month.length == 1) { 
        month = "0" + month; 
    } 
    if (day.length == 1) { 
        day = "0" + day; 
    }
    if (mm.length == 1) { 
        mm = "0" + mm; 
    } 
    if (hh.length == 1) { 
        hh = "0" + hh; 
    }
    if (ss.length == 1) { 
        ss = "0" + ss; 
    }
    var dateTime = year + "-" + month + "-" + day+" "+hh+":"+mm+":"+ss;
    return dateTime; 
}
/**
 * 保留小数位数、保留百分号
 * val 值
 * num 保留几小数
 * rate 是否保留百分号
 */
 function numToFixed(val, num, rate){
    val = val ? val : 0;
    num = num ? num : 0;
    val = Number(val).toFixed(num) + (rate || '');
    return val;
}
 /**
 * dom导出pdf
 * @param {pdf文件名称} htmlTitle 
 * @param {pdf文件名称时间} currentTime 
 * @param {需要转换pdf的dom} dom 
 * @param {下载pdf按钮的下载状态} btns
 * @param {学生报告，学生端pdf显示水印} isWaterMark 是否显示水印
 * @param {导出哪部分，主三科+成绩单 top；选科 bot} showPart
 */
  function getPdf(htmlTitle, currentTime, dom, btns, isWaterMark, showPart){
    this.loading=true;
    this.showPart = showPart;
    this.$set(this, 'isRefresh', false);
    console.log(this.showPart,'showPart,,lllll')
    this.$refs[btns].$el.setAttribute('disabled',true);
    this.$refs[btns].$el.style.background="#ccc";
    this.$refs[btns].$el.textContent="正在下载PDF";
    let _this = this;
    // if(this.disabledBtn){//页面没有加载完不允许下载pdf
    //     return false;
    // }
    
    var title = htmlTitle
    var element = document.getElementById(dom);

    var pdf_part = document.querySelectorAll('.part_canvas');
   /*  if(showPart =='top'){//成绩单+主三科
        pdf_part.forEach((item,index)=>{
            if(index===0||index==1||index==2||index==3||index==4||index==5){
                item.style.display="block;"
            }else{
                item.style.display="none;"
            }
        });
    }else{//选科
        pdf_part.forEach((item,index)=>{
            if(index!==0&&index!=1&&index!=2&&index!=3&&index!=4&&index!=5){
                item.style.display="block;"
            }else{
                item.style.display="none;"
            }
        });
    } */
  
    setTimeout(()=>{
        if(isWaterMark){
            Watermark.set("精华教育考试研究院");
        }
        var pdf = new jspdf("p", "mm", "a4") // A4纸，纵向
        var toCanvas = document.querySelectorAll('.part_canvas'); 
         
        var chartCount = 0;
        var index=0;
        
       
        var arr = new Array();
        arr.push(pdf);
        arr.push(toCanvas);
        arr.push(chartCount);
        arr.push(index);
        arr.push(0);
        arr.push(htmlTitle+currentTime);
        arr.push(0);
        arr.push(0);
    
        createPdf(arr, _this, btns, showPart); 
    }, 100)
   
}
/**
 * 导出pdf，页面部分导出
 * @param {*} arr 页面部分导出元素
 * @param {*} _this 访问页面中的变量
 * @param {*} btns 导出pdf按钮禁用、启用
 */
function createPdf(arr, _this, btns, showPart){
    var ii = arr[4];
    arr[1].forEach((item,index)=>{
        if(index !== ii){
            item.style.display="none;"
        }else{
            item.style.display="block;"
        }
    })
    if(!arr[1][ii]) return false;
    arr[7] += arr[1][ii].clientHeight;
    // window.scrollTo(0,element.offsetTop);//最为关键的地方 需要滚动到指定标签  否则图片不全
    setTimeout(()=>{       
        html2canvas(arr[1][ii], {
            scale: 2,
            dpi: 144,
            useCORS:true,
            logging: false,
            async:false,//同步执行
            backgroundColor:'#f2f1f1',
        }).then(function (canvas) {
            // var pdf = new jspdf("p", "mm", "a4") // A4纸，纵向
            var ctx = canvas.getContext("2d")
            arr[6] += canvas.height;
            // var a4w = 170; var a4h = 257 // A4大小，210mm x 297mm，四边各保留20mm的边距，显示区域170x257
            var a4w = 210; var a4h = 297 // A4大小，210mm x 297mm，四边各保留20mm的边距，显示区域170x257
            var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度
            var renderedHeight = 0
    
            while (renderedHeight < canvas.height) {
            var page = document.createElement("canvas")
            page.width = canvas.width
            page.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页
    
            // 用getImageData剪裁指定区域，并画到前面创建的canvas对象中
            page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)
            //在pdf.addImage(pageData, 'JPEG', 左，上，宽度，高度)设置在pdf中显示；
            arr[0].addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, a4w-2, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面，保留10mm边距
    
            renderedHeight += imgHeight
            if (renderedHeight < canvas.height) { arr[0].addPage() }// 如果后面还有内容，添加一个空页
            // delete page;
            }
            arr[2] += 1;;
            arr[3] += 1;
            arr[4] += 1;
            if(arr[4]<arr[1].length){
                arr[0].addPage();
                createPdf(arr, _this, btns, showPart);
            }else{
                arr[0].save(arr[5]);
                arr[1].forEach(item=>{
                    item.style.display="block;"
                })
                document.getElementsByTagName('html')[0].scrollTop = 0;
                _this.loading = false;
                _this.$refs[btns].$el.removeAttribute('disabled');
                _this.$refs[btns].$el.style.background="";
                // * @param {导出哪部分，主三科+成绩单 top；选科 bot} showPart 
                let con = '';
                if(showPart =='top'){ con = '下载PDF报告（成绩单+主三科）'};               
                if(showPart =='bot'){ con = '下载PDF报告（选科）'};                
                _this.$refs[btns].$el.textContent= con;
                _this.showPart ='';
                _this.subList = [];
                _this.$set(_this, 'subList', _this.subLists);
                setTimeout(()=>{
                    _this.$set(_this, 'isRefresh', true);
                }, 0)
                // _this.$refs[btns].$el.textContent="下载PDF"
                
            }
        })
    }, 0)
}
//客户详情
function toCusInfo(customerId){
    axios.post(crmUrl+'/ft/ftchoose/getUserInfo.do').then(res => {
        if(res.data!=null && res.data!='' && res.data.code==0){
            let url='/common/login/returnQrz.do?userRoleId='+res.data.userRole
                +'&gname=客户详情&gurl=/common/customer/customer_index.do?customerId='+customerId
                +'&gparm=;userRole='+res.data.userRole;
            window.open(crmUrl+url);
        }else{
            ElMessage.error(res.data.msg);
        }
    }, err => {
        console.log(err);
    });
}

//判断图片是否存在
function CheckImgExists(imgurl,success,err) {
    var ImgObj = new Image(); //判断图片是否存在  
    // ImgObj.onload=function(){
    //     console.log(ImgObj.width,ImgObj.height);
    //     success && success(ImgObj)
    // }
    // ImgObj.onerror=function(){
    //     console.log('error');
    //     err && err(ImgObj)
    // }
    // ImgObj.src = imgurl;
    ImgObj.src = imgurl;  
    //存在图片
    if (ImgObj.fileSize > 0 || (ImgObj.width > 0 && ImgObj.height > 0)) {  
        return true;
    } else {  
        return false;
    }   
}
function formatDate(date, fmt) {
    // console.log("date:" + date);
    // console.log("fmt:" + fmt);

      //如果不是时间格式
    if (!(date instanceof Date)) {
        let newDate = new Date();
        if (typeof (date)=='number') {
            newDate.setTime(date);
        }else {
            //1 时间带日期的 - /
            //日期跟时间分开
            let arr = date.split(' ');
            let y = M = d = h = m = s = 0;
            // console.log("arr[0]:" + arr[0])
            let tdate = arr[0].split(/[-/]/);
            if (tdate.length == 1) {
                newDate.setTime(parseInt(date) * 1000);
            }
            else {
                y = tdate[0];
                M = tdate[1];
                d = tdate[2];
                let time = arr[1].split(':');
                if (time.length > 0) {
                    h = time[0];
                    m = time[1];
                    s = time[2];
                }
                newDate = new Date(y, M, d, h, m, s);
            }
        }
        date = newDate;
    }
    if (!fmt) {
        fmt = 'yyyy-MM-dd';
    }

    var o = {
        "M+": date.getMonth() + 1, //月份
        "d+": date.getDate(), //日
        "h+": date.getHours(), //小时
        "m+": date.getMinutes(), //分
        "s+": date.getSeconds(), //秒
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度
        "S": date.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}
//混 合排序
function mixSort(_a, _b) {
    let a = _a.toString();
    let b = _b.toString();
    var an = (a.match(/\d+(.\d+)?/g) && a.match(/\d+(.\d+)?/g).length) ? a.match(/\d+(.\d+)?/g)[0] : a;
    var bn = (b.match(/\d+(.\d+)?/g) && b.match(/\d+(.\d+)?/g).length) ? b.match(/\d+(.\d+)?/g)[0] : b;
    if(parseFloat(an) > parseFloat(bn)){
        return 1;
    }else if(parseFloat(an) < parseFloat(bn)){
        return -1;
    }else {
        return a.localeCompare(b)
    }
}
/***
 * table表格列排序，只适用于单类型，不适合混合类型
 * @param data 数据
 * @param primary 字段
 * @param sortType true升序 false降序
 * @param status 缺考字段 1为缺考
 * @param more 是否有循环的多列的动态数据
 * @param moreProp 有多循环的多列的动态数据字段 【建议用同一个】
 * '%'、'/尾部'、数字、汉字
 */
 function sort(data, primary, sortType, status, more, moreProp) {
    if(primary==null){
        return data;
    }else if(more){//如果列有多项数据
        let datas = []; 
        let resultData = []; 
        let colunmIndex = parseInt(primary);//获取当前排序的小题所在数据中的索引，要排哪一列
        data.forEach( item =>{//将排序的数据，挑出来组合成一个数组。
            if(item['columns']){//假如该生没有小题
                let obj = {};
                obj[moreProp] = item['columns'][colunmIndex][moreProp];
                obj['customerId'] = item['customerId'];
                datas.push( obj );
            }else{
                if(item.customerId){
                    datas.push({
                        customerId: item.customerId
                    })
                }else{
                    datas.push({//针对中考，后台的数据里，没有办法返回customerId，只有qname
                        qname: item.qname
                    })
                }
              
            }
        });
        let result = sortFn(datas, moreProp, sortType, status, more);//对该数组进行排序
        if(result && result[0] && result[0]['customerId']){
            result.forEach( item =>{//根据排序之后的数据，对学生进行重组排序
                let resultIndex = data.findIndex( items =>{return item.customerId == items.customerId});
                if(resultIndex>=0){
                    resultData.push(data[resultIndex]);
                }
            })
        }else{
            resultData = data;
        }
       
        return resultData;
    }else{
        return sortFn(data, primary, sortType, status, more);
    }
}
//排序的方法
function sortFn(data, primary, sortType, status, more){
    if(!data){
        return [];
    }
    return data.sort((x, y) => {//比较函数
        if (x instanceof Object) {
            if(x[primary] || x[primary] === 0){
                if(x[primary] && !isNaN(Number(x[primary])) || x[primary] === 0){//数字比较，非百分比
                    x = (Number(x[primary])|| parseInt(x[primary])===0)?Number(x[primary]) : '';
                    y = (Number(y[primary])|| parseInt(y[primary]) ===0)?Number(y[primary]) : '';
                }else if((x[primary] && x[primary].indexOf('%')>-1)){//数字比较，百分比
                    x = (parseFloat(x[primary]) || parseFloat(x[primary]) ===0) ?parseFloat(x[primary]) : '';
                    y = (parseFloat(y[primary]) || parseFloat(y[primary]) ===0) ? parseFloat(y[primary]) : '';
                }else if((x[primary] && x[primary].indexOf('/')>-1)){//数字比较，‘/’
                    let xarr = String(x[primary]).split('/')[1];
                    let yarr = String(y[primary]).split('/')[1];
                    x = parseFloat(xarr) || '';
                    y = parseFloat(yarr) || '';
                }else{
                    x= (x[primary] || x[primary]===0) ? x[primary] :'';//字符比较
                    if((y[primary] && y[primary].indexOf('%')>-1)){
                        y = (parseFloat(y[primary]) || parseFloat(y[primary]) === 0) ? parseFloat(y[primary]) : '';
                    }else{
                        y= (y[primary] || y[primary]===0) ? y[primary] : '';
                    }                                
                }
            }
        }
        let ret = 0
        if(sortType){//升序
            if(x[status]==1){//当成绩为缺考的时候，排序永远都在最后显示
                x='a';
            }
            if(y[status]==1){
                y='a';
            }
        }
       
        if(/[\u4e00-\u9fa5]/.test(x) || /[\u4e00-\u9fa5]/.test(y)){//文字
            if(sortType){//升序
                if(x && (!y && y!==0)){//如果升序有空值,不包括0
                    return -1;
                }
                return x.localeCompare(y,'zh');
            }else{
                return y.localeCompare(x,'zh');
            }
        }else{
            if(((x || Number(x)===0) && (!y && y!==0))){//如果升序有空值,不包括0
                ret = -1;
            }else{
                if (x < y) {
                    ret = -1;
                } else if (x > y) {
                    ret = 1;
                }
            }
        }
        return sortType ? ret : -ret;
    })
}
/**
 * 根据年月获取当前的日期
 * @param year
 * @param month
 * @returns {Array}
 */
function getWeek() {
    return ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
}
/**
 * 是否闰年
 * @param year
 * @returns {boolean}
 */
function isLeapYear(year) {
    var cond1 = year % 4 == 0;  //条件1：年份必须要能被4整除
    var cond2 = year % 100 != 0;  //条件2：年份不能是整百数
    var cond3 = year % 400 == 0;  //条件3：年份是400的倍数
    //当条件1和条件2同时成立时，就肯定是闰年，所以条件1和条件2之间为“与”的关系。
    //如果条件1和条件2不能同时成立，但如果条件3能成立，则仍然是闰年。所以条件3与前2项为“或”的关系。
    //所以得出判断闰年的表达式：
    return cond1 && cond2 || cond3;

}
/**
 * 获取本月的日历
 * @param oldDate
 * @returns {{nullLength: number, data: Array}}
 */
function getAllDays(oldDate) {
    let months = [1, 3, 5, 7, 8, 10, 12];
    //  console.log("getAllDays:" + oldDate)
    let date = new Date();
    date.setTime(Date.parse(oldDate.toString()))
    // console.log('year:' + date.getFullYear() + ',M:' + date.getMinutes() + ',d:' + date.getDay)
    let nday = [];
    let rday = [];
    let nowDay = 0;
    date.setDate(1)
    let weekday = 0; //第一天是星期几
    let day = months.includes((date.getMonth() + 1)) ? 31 : 30; //最后一天的日期
    if (date.getMonth() + 1 == 2) {
        day = isLeapYear(date.getFullYear()) ? 29 : 28;
    }
    //获取本月第一天是周几
    weekday = date.getDay();
    date.setDate(date.getDate() - weekday - 1);
    for (let i = 0; i < weekday; i++) {
        date.setDate(date.getDate() + 1);
        nday.push({date: date.getDate(), type: 'last-month'})
    }

    for (let i = 1; i <= day; i++) {
        nday.push({date: i});
        if (nday.length == 7) {
            rday.push(nday);
            nday = [];
        }
        nowDay = i;
    }
    // console.log('nday:' + nday.length);
    if (nday.length > 0 && nday.length < 7) {
        let temp = 0;
        for (let i = nday.length; i < 7; i++) {

            temp++
            nday.push({date: temp, type: 'next-month'})
        }
        rday.push(nday);
    }
    return {nullLength: weekday, day: rday, nowDay: nowDay};
}
/**
 * JS大小转化B KB MB GB的转化方法
 * @param {*} limit 
 */
function conver(limit){  
    var size = "";  
    if( limit < 0.1 * 1024 ){ //如果小于0.1KB转化成B  
        size = limit.toFixed(2) + "B";    
    }else if(limit < 0.1 * 1024 * 1024 ){//如果小于0.1MB转化成KB  
        size = (limit / 1024).toFixed(2) + "KB";              
    }else if(limit < 0.1 * 1024 * 1024 * 1024){ //如果小于0.1GB转化成MB  
        size = (limit / (1024 * 1024)).toFixed(2) + "MB";  
    }else{ //其他转化成GB  
        size = (limit / (1024 * 1024 * 1024)).toFixed(2) + "GB";  
    }  
      
    var sizestr = size + "";   
    var len = sizestr.indexOf("\.");  
    var dec = sizestr.substr(len + 1, 2);  
    if(dec == "00"){//当小数点后为00时 去掉小数部分  
        return sizestr.substring(0,len) + sizestr.substr(len + 3,2);  
    }  
    return sizestr;  
}  
/**
 * @arr 处理的选项数据options
 * @newArrLength answerType一行显示几个重新处理数据
 *  */ 
 function changeArrGroup(arr, newArrLength, clickAnswer){
    if(clickAnswer){//学生分班测试-开始考试的时候，一行显示几个，统一一行一个，这样答案可以根据index来赋值
        newArrLength=1;
    }
    let changeIndex = 0;
    let secondArr = [];
    if(!newArrLength){
        return [];
    }
    while (changeIndex < (arr && arr.length)) {
        secondArr.push(arr.slice(changeIndex, changeIndex+=newArrLength))
    }
    return secondArr;
}
/**
 * @answerType 试题库显示，选项样式，一行显示几个
 * @datas 处理的数据
 * @key
 * @val
 * @clickAnswer 是否要回答的选项，不分题样式
 */
function formatOptions(dataList, _this, clickAnswer){
    // let _this = this;
    let datas = JSON.parse(JSON.stringify(dataList));
    let flag = false;
    if(!(Array.isArray(datas))){
        datas = [datas];
        flag = true;
    }
    for(let i = 0; i< datas.length; i++){
        let item = datas[i];
        // queryOption 1选择题 2简答题 3阅读题 4语文材料题
        if(item.queryOption==1){
            item.options = changeArrGroup(item.options, item.answerType, clickAnswer);
        }else if(item.queryOption==3){
            if(!item.littleQuestion) return false;
            for(let j=0; j< item.littleQuestion.length; j++){
                let items = item.littleQuestion[j];
                items.options = changeArrGroup(items.options, items.answerType, clickAnswer);
            }
        }else if(item.queryOption==4){
            for(let j=0; j< item.bigQuestion.length; j++){
                let items = item.bigQuestion[j];
                for(let jj=0; jj< items.littleQuestion.length; jj++){
                    let itemss = items.littleQuestion[jj];
                    itemss.options = changeArrGroup(itemss.options, itemss.answerType, clickAnswer);
                }
            }
        }
    }
    if(flag){
        return datas[0]
    }else{
        return datas
    }
}
/**
 * 身份证分为一代身份证（15位）和二代身份证（18位）
 * @param {身份证号} IDCard 
 * @param {出生日期} birDate
 * @returns 身份证号 计算 年龄
 */
function analyzeIDCard(IDCard, birDate){
	var age = 0,yearBirth,monthBirth,dayBirth;
	//获取用户身份证号码
	var userCard = IDCard;
	//如果身份证号码为undefind则返回空
	if(!userCard){
		return age;
	}
    // // 获取性别
    // if(parseInt(userCard.substr(16,1)) % 2 == 1){
    //     sexAndAge.sex = '1 男'
    // }else{
    //     sexAndAge.sex = '0 女'
    // }
	var reg = /(^\d{15}$)|(^\d{17}([0-9]|X)$)/; //验证身份证号码的正则
	if (reg.test(userCard)) {
		if (userCard.length == 15) {
				var org_birthday = userCard.substring(6, 12);
				//获取出生年月日
				yearBirth = "19" + org_birthday.substring(0, 2);
				monthBirth = org_birthday.substring(2, 4);
				dayBirth = org_birthday.substring(4, 6);
		    } else if (userCard.length == 18) {
				//获取出生年月日
				yearBirth = userCard.substring(6,10);
				monthBirth = userCard.substring(10,12);
				dayBirth = userCard.substring(12,14);
				
			}
			//获取当前年月日并计算年龄
			var myDate = new Date();
			var monthNow = myDate.getMonth() + 1;
			var dayNow = myDate.getDate();
			var age = myDate.getFullYear() - yearBirth;
			if(monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)){
				age--;
			}
			//返回年龄
			return age;
	} else {
		return ''
	}
	
}

export {
    dateToString,
    dateToString2,
    toCusInfo,
    CheckImgExists,
    formatDate,
    sort,
    getWeek,
    getAllDays,
    conver,
    formatOptions,
    numToFixed,
    getPdf,
    mixSort,
    analyzeIDCard
}